package com.yangyouli.unity_demo_server.util;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 解析 dom 文件的工具类
 * @author 24279
 *
 */
public class ReadStringXml {
	static Logger log = Logger.getLogger(ReadStringXml.class);
	
	/**
	 * 得到 xml 中某个节点下的 value 值，该节点必须为叶节点<br>
	 * 要求输入节点全路径，如 /container/controller-package/package <br>
	 * @param xmlPath xml 资源路径，以 src 为根目录（不包含 src）
	 * @param nodePaths 节点的全路径 如 /container/controller-package/package 
	 * @return 一个 map，key 是节点全路径，value 是节点的值的字符串集合
	 */
	public static Map<String, List<String>> getNodesValues (String xmlPath, String[] nodePaths) {
		Map<String, List<String>> valueMap;
		valueMap = readStringXml(xmlPath, nodePaths);
		return valueMap;
	}
	
	/**
	 * 找到 xml 资源并且遍历
	 * @param xmlPath
	 * @param nodePaths
	 * @return
	 */
	private static Map<String, List<String>> readStringXml(String xmlPath, String[] nodePaths) {
		Map<String, List<String>> valueMap = new HashMap<>();
		
        InputStream is = ReadStringXml.class.getResourceAsStream("/" + xmlPath);
        
		Document doc = null;
		SAXReader sr = new SAXReader();
		try {
			doc = sr.read(is);
			Element root = doc.getRootElement();
			getNodes(root, nodePaths, valueMap);
		} catch (DocumentException e) {
			log.error("找到 xml 资源并且遍历", e);
		}
		return valueMap;
	}
	
	/**
	 * 传入一个节点在 xml 文件中的路径数组（必须为叶节点），如 /container/controller-package/package<br>
	 * 获取其下的所有改节点的值, 并将值添加到 valueMap 中<br>
	 * @param node 节点对象
	 * @param nodePaths 节点路径数组
	 * @param valueMap 指定节点值列表
	 */
	@SuppressWarnings("unchecked")
	private static void getNodes(Element node, String[] nodePaths, Map<String, List<String>> valueMap) {
		// 得到所有的子节点
		List<Element> listElement = node.elements(); // 所有一级子节点的list
		
		// 判断是否为叶节点
		if (listElement.size() > 0) {
			// 不是叶节点，其下还有元素，继续遍历
			for(Element e : listElement) { // 遍历所有子节点
				getNodes(e, nodePaths, valueMap); // 递归
			}
		} else {
			// 为叶节点，比较是否是我们需要的节点, 是则添加
			for (String path : nodePaths) {
				if (node.getPath().equals(path)) {
					// 是我们需要的节点
					// 得到 valueMap 中存储节点值的 List<String>
					List<String> values = valueMap.get(path);
					if (values == null) {
						// 没有则创建，并将该集合添加到 valueMap 中
						values = new ArrayList<>();
						valueMap.put(path, values);
					}
					// 将叶节点的值添加进list
					values.add(node.getTextTrim());
				}
			}
		}
	}
	
}
